# 34. 正则表达式


# 正则表达式


# 正则表达式概念

先来明确一件事

  1. 正则表达式是一种独立的语法
  2. 不是python的功能,python只是用到这个语法
  3. 正则表达式比Python还久远

什么是正则表达式

  1. 什么是正则表达式
    1. 一种匹配字符串的规则
    2. 比如匹配用户输入的一串数据
      1. 判断是不是QQ号
      2. 判断是不是手机号
      3. 判断是不是身份证
      4. 等等等......
    3. 比如有一个用户文件数据
      1. 可以把文件中的数据进行分析
      2. 提取出手机号
      3. 提取出用户名
      4. 提取出爱好
      5. 等等等......

那正则表达能做什么

  1. 可以定制一个规则,让程序按这规则来判断
    1. 可以来判断某一串数据是不是符合规则
    2. 可以从大量数据中找到符合规则的内容
  2. 程序领域
    1. 可以用于登录注册页的表单验证
    2. 可以用于爬虫过滤、分析等
    3. 可以用于运维开发的数据分析
    4. 可以用于数据分析

总结

  1. 学re模块
    1. 先学正则表达式语法、
    2. 在学怎么用python来操作正则
    3. 正则表达式在线测试网站:http://tool.chinaz.com/regex/

# 正则表达式之字符组

字符组,就是以 [ ] 为一个范围

  1. 如果只有单个[ ] ,
    1. 那么就代表匹配[ ]中的规则,注意:[ ]中每一个字符都代表匹配一次
    2. 如果单个 [ 0 - 9 ],就相当匹配数据中的所有数字
    3. 如果单个 [ a - z ],就相当匹配数据中的所有小写字母
    4. 如果单个 [ A - Z ],就相当匹配数据中的所有大写字母
    5. 如果单个 [ 0 - 9 a - z A - Z ],就相当匹配数据中的所有数字、小写字母、大写字母
    6. 如果单个 [ 0 - 9 A - z ],就相当匹配数据中的所有数字、小写字母、大写字母
    7. 如果单个 [ 0 - 9 a - f A -F ],就相当匹配数据中数字,大小写形式的a~f,用来验证十六进制字符
  2. 如果有多个[ ]
    1. 那么就代表匹配多个字符
      1. [] [] 二个中括号就代表匹配二个字符
      2. [] [] [] 三个中括号就代表匹配三个字符
      3. [ ]中的操作跟上面单个[] 一样
  3. 匹配身份证:[1-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9] [0-9xX]

# 正则表达式之元字符

元字符:提供简写的字符组

以下按博主习惯分个类

  1. 常用正反元字符法
      1. \w :匹配字母跟数字跟下划线,简单来说,就匹配字母、数字、下划线的任意内容
      2. \d :匹配数字,简单来说匹配所有数字
      3. \s :匹配任意的空白符,简单来说,就是匹配,换行符,空格符,制表符(Tab键符)
        1. \t :匹配一个制表符(Tab键符)
        2. \n :匹配一个换行符
      1. \W :匹配非字母跟数字跟下划线,简单来说,就匹配除了字母、数字、下划线的所有内容
      2. \D :匹配非数字,简单来说匹配除了数字的所有内容
      3. \S :匹配非空白符,简单来说,就是匹配除了换行符、空格符、制表符(Tab键符)的所有内容
        1. \t :匹配一个制表符(Tab键符)
        2. \n :匹配一个换行符
  2. 取头断尾法
    1. ^ :匹配字符串的开始,简单来说,就是匹配这串字符串是否以这规则开头
    2. $ :匹配字符串的结尾,简单来说,就是匹配这串字符串是否以这规则结尾
    3. ^ 值 $ :匹配字符串是否以指定的规则开头跟结尾
  3. or法
    1. a|b :匹配字符是否是a或b,注意:如果使用这种,字符长的一定要放在第一们,因为 | 的执行很简单,找到一个后就不会找另一个,比如 ab|abb,字符串:abbabbbbbbbbbb,那么他就只会找到ab,就不会匹配到abb
  4. 取反法
    1. [^a] : 匹配除了字母a以外的所有字符
  5. .符匹配法
  6. . :.元字符匹配任意一个数,除了换行符
  7. 分组法
    1. ():匹配括号内的表达式,也表示()内的表达式为一个组

# 正则表达式之量词

量词:量词就是在元字符的后一位使用的

  1. *:匹配零次或多次,简单说,匹配没有或无限次
  2. +:匹配前一个值重复一次或更多次
  3. ?:匹配前一个值重复零次或一次
  4. {} :重复次数
    1. {n}:重复次数,如{1},那么前一个值重复1次
    2. {n,}:重复n次或更多次,如{1,},那么前一个值重复1次以上无限数
    3. {n,m}:重复n次或m次,如{2,4},那么前一个值至少重复2次,最多重复4次

惰性匹配

惰性匹配:在量词后面加上?号

因为量词默认都是贪婪匹配,贪婪匹配:尽可能的匹配多的可能性

惰性匹配,让量词从贪婪匹配变成惰性匹配,惰性匹配:尽可能的匹配少的可能性

  1. ?? :重复0次或1次,但尽可能少重复
  2. *? :重复任意次,但尽可能少重复
  3. +? :重复1次或任意次,但尽可能少重复
  4. {n,}? :重复n次以上,但尽可能少重复
  5. {n,m}?:重复n次到m次,但尽可能少重复

匹配身份证

身份证有15位的老身份证,也有18位的新身份证

那使用正则表达式要怎么查找出来

^[1-9]\d{14}(\d{2}[0-9x])?$
^[1-9]\d{16}[0-9x]|^[1-9]\d{14}

匹配字符串直到出现指定的值

.*?a
. 是任意字符
* 是取 0 至 无限长度
? 是非贪婪模式

# 正则表达式之转意符

转意符:\ ,其实也很简单,只要把想转意的在前面加个\ 就行

比如想把匹配 \n ,但是\n在表达式中有着特别的意义,如果想匹配,就需要 \n 就可以了

但是,在表达中 [ ] 中括号中有先一些特殊字符现出有所原型,不用转意

  1. [ () + * ? $ . ]:这一些都是不用加转意符就可以自己转意,都是中括号的功劳
  2. [ \w \d \s(\n,\t, ) \W \D \S ]:这一些就,想要让他们现出原型,就要使用转意符

关于 [ - ]:

  1. [ - ]:只有写在字符组的首位的时候表示普通的减号
  2. [ - ]:写在其他的位置的时候,表示范围[ 0-9 ]
  3. [ - ]:如果不想让他表示范围,用于单纯的 - 字符,需要使用转意符 [ 1 - 9 ]

# 正则表达式之练习题

题目 答案
1、匹配任意长度的正整数 [1-9]\d*
2、匹配小数 -?\d+.\d+
3、匹配整数或者小数 -?\d+(.\d+)? 准确的
-?\d+.?\d* :有缺陷 1. 2. 这样的内容都能被匹配上
-?\d+.?\d+:有缺陷 1 2 这样的一位数都匹配不上了
4、匹配负数 -0.\d+|-[1-9]\d+(.\d+)?
5、匹配qq号 [1-9]\d{4,11}
6、匹配长度为11位的电话号码 1[3-9]\d{9}
7、长度为8-10位的用户密码 [\w@?]{8,10}
8、匹配验证码:4位数字字母组成的 [\da-zA-Z]{4}
1-2*((60-30+(-40/5)(9-25/3+7/399/42998+10568/14))-(-43)/(16-3*2))
从上面算式中匹配出最内层的小括号
([\d.+-*/]+)
([^( )]+)

[^()]: